%% 生成MATLAB参考结果用于与C版本对比
% 这个脚本生成MATLAB版本的关键中间结果，用于验证C实现的正确性

clear; clc;

fprintf('=== 生成MATLAB参考结果 ===\n');

%% 1. 加载数据（与C版本相同的数据）
try
    nodes_table = readtable('data/CSV-version/Conv_Case0_Nodes.csv');
    edges_table = readtable('data/CSV-version/Conv_Case0_Edges.csv');
    fprintf('✅ 数据加载成功: %d 节点, %d 边\n', height(nodes_table), height(edges_table));
catch ME
    fprintf('❌ 数据加载失败: %s\n', ME.message);
    return;
end

%% 2. 预处理（与main1.m相同）
nodes_table.OpCode = double(categorical(nodes_table.Op));
nodes_table.TypeCode = double(categorical(nodes_table.Type));

categories_op = categories(categorical(nodes_table.Op));
categories_type = categories(categorical(nodes_table.Type));

code_map.op.ALLOC = find(strcmp('ALLOC', categories_op), 1);
code_map.op.FREE = find(strcmp('FREE', categories_op), 1);
code_map.type.L1 = find(strcmp('L1', categories_type), 1);
code_map.type.UB = find(strcmp('UB', categories_type), 1);
code_map.type.L0A = find(strcmp('L0A', categories_type), 1);
code_map.type.L0B = find(strcmp('L0B', categories_type), 1);
code_map.type.L0C = find(strcmp('L0C', categories_type), 1);

G = digraph(edges_table.StartNodeId + 1, edges_table.EndNodeId + 1, [], nodes_table);

fprintf('✅ 图对象创建成功: %d 节点, %d 边\n', numnodes(G), numedges(G));

%% 3. 计算传递闭包（核心对比项）
fprintf('计算传递闭包...\n');
is_ancestor = full(adjacency(transclosure(G)));
fprintf('✅ 传递闭包计算完成\n');

%% 4. 输出传递闭包矩阵（与C版本格式一致）
fid = fopen('matlab_transitive_closure.txt', 'w');
fprintf(fid, 'MATLAB传递闭包矩阵 (is_ancestor)\n');
fprintf(fid, '矩阵大小: %d x %d\n', size(is_ancestor, 1), size(is_ancestor, 2));
fprintf(fid, '格式: is_ancestor(i,j) = 1 表示节点i是节点j的祖先\n\n');

% 输出列标题
fprintf(fid, '     ');
for j = 1:size(is_ancestor, 2)
    fprintf(fid, '%3d', j-1); % 转换为0-based索引显示
end
fprintf(fid, '\n');

% 输出矩阵内容
for i = 1:size(is_ancestor, 1)
    fprintf(fid, '%3d: ', i-1); % 转换为0-based索引显示
    for j = 1:size(is_ancestor, 2)
        fprintf(fid, '%3d', is_ancestor(i, j));
    end
    fprintf(fid, '\n');
end

% 输出统计信息
total_edges = sum(is_ancestor(:));
self_loops = sum(diag(is_ancestor));

fprintf(fid, '\n统计信息:\n');
fprintf(fid, '传递闭包中的边数: %d\n', total_edges);
fprintf(fid, '自环数量: %d\n', self_loops);
fprintf(fid, '密度: %.4f\n', total_edges / numel(is_ancestor));

fclose(fid);
fprintf('✅ 传递闭包矩阵已保存到: matlab_transitive_closure.txt\n');

%% 5. 生成初始调度
fprintf('生成初始调度...\n');
initial_schedule = generate_l0_constrained_schedule(G, code_map);
[initial_score, initial_history] = calculate_max_vstay(initial_schedule, G, code_map);
fprintf('✅ 初始调度生成完成: 长度=%d, V_stay峰值=%d\n', length(initial_schedule), initial_score);

%% 6. 验证L0约束
is_valid = is_l0_schedule_valid(initial_schedule, G, code_map);
fprintf('L0约束验证: %s\n', is_valid ? '✅ 通过' : '❌ 失败');

%% 7. 输出对比结果
fid = fopen('matlab_reference_results.txt', 'w');
fprintf(fid, '=== MATLAB参考结果 ===\n');
fprintf(fid, '节点数: %d\n', numnodes(G));
fprintf(fid, '边数: %d\n', numedges(G));
fprintf(fid, '初始调度长度: %d\n', length(initial_schedule));
fprintf(fid, '初始V_stay峰值: %d\n', initial_score);
fprintf(fid, 'L0约束有效性: %s\n', is_valid ? '有效' : '无效');

fprintf(fid, '\n操作类型编码映射:\n');
fprintf(fid, 'ALLOC: %d\n', code_map.op.ALLOC);
fprintf(fid, 'FREE: %d\n', code_map.op.FREE);
fprintf(fid, '\n数据类型编码映射:\n');
fprintf(fid, 'L1: %d\n', code_map.type.L1);
fprintf(fid, 'UB: %d\n', code_map.type.UB);
fprintf(fid, 'L0A: %d\n', code_map.type.L0A);
fprintf(fid, 'L0B: %d\n', code_map.type.L0B);
fprintf(fid, 'L0C: %d\n', code_map.type.L0C);

fprintf(fid, '\n前10个节点信息:\n');
for i = 1:min(10, numnodes(G))
    fprintf(fid, '节点%d: Op=%d, Type=%d, Size=%d\n', ...
            G.Nodes.Id(i), G.Nodes.OpCode(i), G.Nodes.TypeCode(i), G.Nodes.Size(i));
end

fprintf(fid, '\n前20步调度序列:\n');
for i = 1:min(20, length(initial_schedule))
    fprintf(fid, '步骤%d: 节点%d, V_stay=%d\n', i, initial_schedule(i)-1, initial_history(i)); % 转换为0-based
end

% 传递闭包对比数据
fprintf(fid, '\n传递闭包统计:\n');
fprintf(fid, '可达节点对数量: %d / %d\n', total_edges, numel(is_ancestor));
fprintf(fid, '图连通密度: %.2f%%\n', 100.0 * total_edges / numel(is_ancestor));

fclose(fid);

fprintf('✅ 参考结果已保存到: matlab_reference_results.txt\n');

%% 8. 测试一些具体节点的successors/predecessors
fprintf('\n测试图操作函数:\n');
test_nodes = [1, 11, 21, 51]; % MATLAB 1-based索引
for node = test_nodes
    if node <= numnodes(G)
        succ = successors(G, node);
        pred = predecessors(G, node);
        fprintf('节点%d(0-based): %d个后继, %d个前驱\n', node-1, length(succ), length(pred));
    end
end

fprintf('\n=== MATLAB参考结果生成完成 ===\n');
fprintf('请运行C版本测试并对比以下文件:\n');
fprintf('• matlab_transitive_closure.txt vs c_transitive_closure.txt\n');
fprintf('• matlab_reference_results.txt vs test_results.txt\n');
